草庐IT

CountDownLatch和ExecutorService 线程池cachedThreadPool.submit

全部标签

java - 是否允许在非 EDT 线程中加载 Swing 类?

在引入Java内存模型之后,Swing准则被更改为声明任何Swing组件都需要在EDT上实例化,以避免出现未发布的实例状态。我在任何地方都找不到的是,类加载是否也必须在EDT上进行,或者我们可以在后台线程中预加载关键的Swing类吗?Sun/Oracle对此有任何官方声明吗?是否有任何已知的类保持非线程安全静态状态,因此需要在EDT上加载?解决Nemi问题的说明:这是一个实际问题。我们应用程序启动时间的很大一部分花在了EDT上的类加载和字体/图像加载上。其中大部分可以归因于Swing和相关库。这是一些背景:与许多其他Swing应用程序一样,在启动时我们会预先构建许多表单,以使UI更具响

java - 我应该使用 Java 中的哪个线程池?

有大量的任务。每个任务都属于一个组。要求是每组任务应该像在单线程中执行一样串行执行,并且吞吐量应该在多核(或多cpu)环境中最大化。注:还有海量组,与任务数量成正比。天真的解决方案是使用ThreadPoolExecutor和同步(或锁定)。但是,线程会相互阻塞,吞吐量不会最大化。有更好的主意吗?或者有没有第三方库可以满足要求? 最佳答案 一种简单的方法是将所有组任务“串联”为一个super任务,从而使子任务连续运行。但这可能会导致其他组延迟,除非其他组完全完成并在线程池中腾出一些空间,否则这些组不会启动。作为替代方案,请考虑将一组任

java - 无法获取线程转储?知道为什么我的应用程序会阻塞吗?

我有一个基本的Java服务器应用程序,它有100个工作线程,可以对URL执行简单的HEAD请求。我为此使用HttpClient4.x。运行几分钟后,我的程序就卡住了几分钟,我不明白为什么。查看visualvmmonitor报告的屏幕截图。你可以看到它是扁平的。在此期间,我无法获得良好的线程转储,而可视化虚拟机只是卡住,直到它被解锁。有没有人知道我可以做些什么来尝试开始调试这个人?可视化虚拟机:http://tinypic.com/view.php?pic=2i915bs&s=7这是我在卡住时尝试获取jstack转储时的输出:jstack-F4325AttachingtoprocessI

java - 如何找到定时器线程的来源?

我有一个大项目,也使用了很多库。使用jstack我发现有这样的线程:Timer-2,Timer-3,Timer-4....我能显示的jstack是:java.lang.Thread.State:TIMED_WAITING(onobjectmonitor)atjava.lang.Object.wait(NativeMethod)atjava.util.TimerThread.mainLoop(UnknownSource)-locked(ajava.util.TaskQueue)atjava.util.TimerThread.run(UnknownSource)是否可以找到创建这些线程的类

java - Java 中的 FileLock 在同一进程内或不同进程之间或两者之间跨多个线程是否安全?

Java中的FileLock在同一进程内或不同进程之间或两者之间的多个线程之间是否安全?javadoc说:FilelocksareheldonbehalfoftheentireJavavirtualmachine.Theyarenotsuitableforcontrollingaccesstoafilebymultiplethreadswithinthesamevirtualmachine.File-lockobjectsaresafeforusebymultipleconcurrentthreads.我不太明白:这是否意味着FileLock在同一个进程内的多个线程、多个不同进程之间或

具有多个线程的java关闭钩子(Hook)

我正在尝试让一个关闭钩子(Hook)在我的ubuntu服务器上工作,但是我似乎遇到了不止一个线程的问题。使用基本的ShutdownHook,当我使用kill终止进程时,以下代码确实有效,表示关闭行为已激活。publicstaticvoidmain(String[]args){ShutdownHookshutDown=newShutdownHook();shutDown.attachShutDownHook();while(true){}}然而,具有附加线程的相同代码不会publicstaticvoidmain(String[]args){ShutdownHookshutDown=new

java - 如何使用 volatile 变量编写简单的线程安全类?

我想编写一个简单的线程安全类,可用于设置或获取整数值。最简单的方法是使用synchronized关键字:publicclassMyIntegerHolder{privateIntegervalue;synchronizedpublicIntegergetValue(){returnvalue;}synchronizedpublicvoidsetValue(Integervalue){this.value=value;}}我也可以尝试使用volatile:publicclassMyIntegerHolder{privatevolatileIntegervalue;publicIntege

java - final 字段如何防止其他线程看到部分构造的对象?

我正在研究创建一个具有final字段的不可变数据类型(包括在分配给final成员字段之前构造和填充的数组),并注意到JVM似乎被指定为保证任何其他获取此对象引用的线程将看到初始化的字段和数组值(假设在构造函数中没有发布指向this的指针,请参阅Whatisan"incompletelyconstructedobject"?和HowdoJVM'simplicitmemorybarriersbehavewhenchainingconstructors?)。我很好奇这是如何在不同步对该对象的每次访问或以其他方式付出一些显着的性能损失的情况下实现的。根据我的理解,JVM可以通过以下方式实现这一

Java:两个 WAITING + 一个 BLOCKED 线程,notify() 导致活锁,notifyAll() 不会,为什么?

我试图实现类似于Java的有界BlockingQueue的东西当我偶然发现一些我不理解的行为时,使用Java同步“原语”(synchronized、wait()、notify())的接口(interface)。我创建了一个能够存储1个元素的队列,创建了两个等待从队列中获取值的线程,启动它们,然后尝试在主线程的同步块(synchronizedblock)中将两个值放入队列中。大部分时间它都能正常工作,但有时等待一个值的两个线程似乎开始互相唤醒并且不让主线程进入同步块(synchronizedblock)。这是我的(简化的)代码:importjava.util.LinkedList;imp

java - 在 Spring Web 服务器中创建线程以运行超时任务

我正在尝试创建一个运行一组任务的线程,如果它没有在特定时间(比如100秒)内完成,则会抛出异常。目前我正在尝试通过将任务封装到runnable对象中并使用ExecutorService和Future类来执行超时执行来实现这一点。然而,当我启动我的Web服务时,我得到了这个异常:java.util.concurrent.ExecutionException:org.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwithname'scopedTarget.localhostInterpolatorH